#include "head.h"

//加密
//用户名，token
int encode(char *user,char *jwt, char *str)
{

  // JWT字符串的长度
  size_t jwt_length;  

  // 初始化编码参数结构体
  struct l8w8jwt_encoding_params params;
  l8w8jwt_encoding_params_init(&params); 

  // 设置JWT使用的算法，这里使用HS512
  params.alg = L8W8JWT_ALG_HS512;  

  // 设置JWT的主要荷载部分内容:
  // 主题
  params.sub = "project name";  
  // 签发者
  params.iss = "snow";  
  // 接收方
  params.aud = user;  
  // token过期/有效时间(0x7fffffff:最大值-> 2038年1月19日)
  params.exp = 0x7fffffff;  
  // token签发时间
  params.iat = 0;  
 
  // 设置加密密钥
  params.secret_key = (unsigned char*)"snow string token key";
  params.secret_key_length = strlen((char *)params.secret_key);

  // 输出变量
  params.out = &jwt;
  params.out_length = &jwt_length;

  // 加密
  l8w8jwt_encode(&params);

  // 输出结果
 // printf("l8w8jwt create token: %s \n",  jwt);
 // printf("len: %d \n", strlen(jwt));
  memcpy(str, jwt, strlen(jwt));
  
  printf("123 \n");

 // memcpy(*jwt, str, strlen(str));
  // 释放token 字符串的内存
  //l8w8jwt_free(jwt);
  return 0;
}

//解密
//token
int decode(char *user,char *str, char *buf){

	// 初始化解码参数结构体
   struct l8w8jwt_decoding_params params;
   l8w8jwt_decoding_params_init(&params);

	// 设置JWT使用的算法，这里使用HS512
   params.alg = L8W8JWT_ALG_HS512;  
    // 填入token字符串和长度
   params.jwt = (char*)str;
   params.jwt_length = strlen(str);

   // 设置密钥
   char *key="snow string token key";
   params.verification_key = (unsigned char*)key;
   params.verification_key_length = strlen(key);

   // 定义: 接收结果的指针和变量
   struct l8w8jwt_claim *claims = NULL;
   size_t claim_count = 0;
   enum l8w8jwt_validation_result validation_result;

   // 解码: 获得token中存储的信息
   int decode_result = l8w8jwt_decode(&params, &validation_result, &claims, &claim_count);

   // 判断是否是正确的token
   if (decode_result == L8W8JWT_SUCCESS && validation_result == L8W8JWT_VALID) {

           user= claims[5].value;
            printf("uname=%s\n", user);
            memcpy(buf, user, sizeof(user));
            printf("buf=%s\n", buf);
   } else {
       printf("Token validation failed!\n");
   }

   l8w8jwt_free_claims(claims, claim_count);

   return 0;
}
